Раздел: Языковые конструкции и приемы программирования

Третий уровень сложности

1. Словарь Counter из библиотеки collections.
* Ответ (Лекция 2): Специализированный подкласс словаря для подсчета хэшируемых объектов.
* Особенность: Ключи — элементы, значения — их количество.
* Пример: Counter("abacaba"){'a': 4, 'b': 2, 'c': 1}.

2. Словарь defaultdict из библиотеки collections.
* Ответ (Лекция 3): Словарь, который не выбрасывает ошибку KeyError, если обратиться к несуществующему ключу. Вместо этого он создает запись с "дефолтным" значением.
* Применение: Удобен для создания словарей списков или счетчиков без проверок if key not in d.
* Пример:

    from collections import defaultdict
    d = defaultdict(int) # При обращении к новому ключу создаст 0
    d['a'] += 1

3. Многомерный массив numpy.
* Ответ (Лекция 2, 5): Основная структура данных библиотеки NumPy.
* Особенности:
* Все элементы одного типа (обычно числа).
* Поддерживает многомерные срезы (например, M[:, 1] — выделение столбца).
* Векторизованные операции (сложение массивов без явных циклов).

4. Декораторы.
* Ответ (Лекция 7): Это функция, которая принимает другую функцию и возвращает новую функцию, добавляя к исходной дополнительную функциональность (обертку).
* Синтаксис: @имя_декоратора над определением функции.
* Применение: Логирование, кеширование (@cache), проверка прав доступа.

5. Замыкание (захват переменных).
* Ответ (Лекция 7): Ситуация, когда вложенная функция "помнит" и имеет доступ к переменным из области видимости внешней функции, даже когда внешняя функция уже завершила работу.
* Пример: В декораторе внутренняя функция wrapper использует переменную func (исходную функцию), которая была аргументом внешней функции.

6. Дополнение функций атрибутами.
* Ответ (Лекция 7): Поскольку в Python функции — это объекты, к ним можно привязывать собственные атрибуты.
* Пример:

    def func(): pass
    func.cache = {} # Храним кеш прямо в функции
    func.count = 0  # Или счетчик вызовов

7. property, геттер и сеттер.
* Ответ (Лекция 9):
* @property: Декоратор, позволяющий превратить метод класса в атрибут (вычисляемое свойство). К нему обращаются через точку без скобок obj.prop.
* Геттер: Метод для получения значения.
* Сеттер (@name.setter): Метод, вызываемый при присваивании значения свойству (obj.prop = value). Позволяет добавить валидацию данных.

8. Наследование классов.
* Ответ (Лекция 8, 9): Механизм ООП, позволяющий создавать новый класс на основе существующего, перенимая его атрибуты и методы.
* Синтаксис: class Student(Person):.

9. Обход базовых классов при множественном наследовании, MRO.
* Ответ (Лекция 9):
* MRO (Method Resolution Order): Порядок разрешения методов. Это список, определяющий, в какой последовательности Python ищет методы в иерархии классов.
* Суть: При ромбовидном наследовании (D наследует от B и C, которые наследуют от A), MRO гарантирует, что общий предок A будет посещен только один раз и после потомков.
* Посмотреть порядок: ClassName.mro().

10. Словари globals, locals, __dict__.
* Ответ (Лекции 7, 8): Инструменты интроспекции.
* globals(): Словарь глобальных переменных текущего модуля.
* locals(): Словарь локальных переменных текущей функции.
* obj.__dict__: Словарь атрибутов конкретного объекта (или класса). Используется для прямого доступа к пространству имен объекта.

11. Декоратор @abstractmethod.
* Ответ (Лекция 8): Декоратор из модуля abc. Помечает метод как абстрактный.
* Правило: Класс, содержащий такой метод, нельзя инстанцировать (создавать экземпляры). Наследники обязаны реализовать этот метод.

12. Атрибуты экземпляра и атрибуты класса, статические методы и методы класса.
* Ответ (Лекция 9):
* Атрибуты экземпляра: Хранятся в self (уникальны для каждого объекта).
* Атрибуты класса: Объявляются в теле класса вне методов (общие для всех объектов, например, счетчик созданных объектов).
* @staticmethod: Метод, которому не нужен доступ ни к self, ни к cls. Просто функция внутри пространства имен класса.
* @classmethod: Метод, который принимает первым аргументом класс (cls), а не экземпляр. Используется для альтернативных конструкторов или работы с атрибутами класса.

13. Конструктор __new__.
* Ответ (Лекция 9): Истинный конструктор объекта. Статический метод, который создает и возвращает новый экземпляр класса.
* Когда нужен: Редко. Например, для создания синглтонов (Singleton) или при наследовании от неизменяемых типов (str, int, tuple). Вызывается перед __init__.

14. Деструктор __del__.
* Ответ (Лекция 9): Метод, вызываемый перед уничтожением объекта сборщиком мусора (когда счетчик ссылок падает до 0).
* Применение: Закрытие файлов, сетевых соединений (но полагаться на него не стоит, лучше использовать менеджеры контекста).

15. __class__, __name__, type.
* Ответ (Лекция 9):
* obj.__class__: Ссылка на класс, к которому принадлежит объект.
* cls.__name__: Строковое имя класса.
* type(obj): Возвращает тип объекта (его класс).

16. super().
* Ответ (Лекция 9): Функция для доступа к методам родительского класса.
* Зачем: Позволяет вызывать методы предков (например, super().__init__(...)) без явного указания имени родительского класса, что важно для поддержки MRO при множественном наследовании.

17. __setattr__ и __getattr__.
* Ответ (Лекция 10): Магические методы для перехвата доступа к атрибутам.
* __setattr__(self, name, value): Вызывается при любой попытке присвоить значение атрибуту (obj.x = 10). Используется для валидации или автоматической логики.
* __getattr__(self, name): Вызывается только если атрибут не найден обычным способом.

18. __call__.
* Ответ (Лекция 10): Магический метод, позволяющий вызывать экземпляр класса как функцию: obj().
* Применение: Создание объектов-функторов (например, класс Decorator или Averager с состоянием).

← Меню